package com.sugon.dao;

import com.sugon.entity.DevAmTicketEntity;
import com.sugon.modules.device.model.vo.DevAmTicketVO;
import com.sugon.modules.device.model.vo.DeviceTicketStatVO;
import com.sugon.modules.kpi.model.dto.DevManintenanceTicketMonthlyStatData;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 设备自主维护工单数据Dao
 *
 * @author YuXD
 * @date 2023-01-23
 */
public interface DevAmTicketDao extends BaseDao<DevAmTicketEntity> {

    /**
     * 查询所有符合条件的设备维护工单记录
     *
     * @param map
     * @return
     */
    List<DevAmTicketVO> queryAll(Map<String, Object> map);

    /**
     * 更新指定设备的维护工单状态
     *
     * @param devId  设备ID
     * @param status 工单状态
     * @return
     */
    int updateTicketStatus(@Param("devId") String devId, @Param("status") Integer status, @Param("remark") String remark);

    /**
     * 条件查询总记录数
     *
     * @return
     */
    int queryAllTotal(Map<String, Object> map);

    /**
     * 获取以maintenanceCodePrefix为前缀的最新值
     *
     * @param maintenanceCodePrefix
     * @return
     */
    String getLastestMaintenanceCode(@Param("codePrefix") String maintenanceCodePrefix);

    /**
     * 统计某个部门下 尚未完成的设备维护工单
     * 目前只统计维护人员未开始维护前的工单列表
     * 即DevMaintenanceTicketStatus中状态为1,2,3这三个状态的工单
     *
     * @param deptId 部门ID,一般是车间ID
     * @return
     */
    List<DeviceTicketStatVO> statIngDeviceTicketByDeptId(@Param("deptId") String deptId);

    /**
     * 统计部门未完成的设备工单
     *
     * @param deptId 部门ID
     * @return
     */
    List<Map<String, Object>> statIngDeptDeviceTicket(@Param("deptId") String deptId);

    /**
     * 统计某一年度的指定设备列表内的每个月的所有维护工单数
     *
     * @param yearly       年度
     * @param deviceIdList 设备列表
     * @return
     */
    List<DevManintenanceTicketMonthlyStatData> statMonthlyTotalTimes(@Param("yearly") Integer yearly, @Param("deviceIdList") String deviceIdList);

    /**
     * 统计某一年度的指定设备列表内，每个月已完成的维护工单数
     *
     * @param yearly       年度
     * @param deviceIdList 设备列表
     * @return
     */
    List<DevManintenanceTicketMonthlyStatData> statMonthlyCompletedTotalTimes(@Param("yearly") Integer yearly, @Param("deviceIdList") String deviceIdList);


    /**
     * 统计本年度到上周为止的设备维护工单中
     * 完成和延期(完成以外的情形)的统计
     *
     * @param params
     * @return
     */
    List<Map<String, Object>> statDevPmCompleteRateStatusNum(Map<String, Object> params);

    /**
     * 进行设备PM工单数分布统计
     * 两个维度：月度和周次
     * 参数中需要包含以下几个参数
     * statStartDate 统计起始时间
     * statEndDate 统计结束时间
     * dimension 维度 MONTHLY or WEEKLY
     *
     * @return
     */
    List<Map<String, Object>> doDevPmTicketDistributionNumStat(Map<String, Object> param);

    /**
     * 获取处于不同状态的设备维护工单统计
     *
     * @param param 包含统计起止时间段
     * @return
     */
    List<Map<String, Object>> doDevMaintenanceTicketStatusNumStat(Map<String, String> param);

    /**
     * 查询匹配的记录
     *
     * @param workshop   车间ID
     * @param yearly     年度
     * @param weekOfYear 当前工单执行周是全年第几周
     * @return
     */
    List<DevAmTicketEntity> queryMatched(@Param("workshop") String workshop, @Param("yearly") Integer yearly, @Param("weekOfYear") Integer weekOfYear);

}
